package com.qf.auth.service.impl;

import com.qf.auth.feign.CheckCodeFeign;
import com.qf.auth.feign.TenantFeign;
import com.qf.auth.service.TenantService;
import com.qf.common.bean.R;
import com.qf.common.dto.TenantDto;
import com.qf.common.model.QfTenant;
import com.qf.common.utils.IdWorker;
import com.qf.common.utils.JwtUtil;
import com.qf.common.utils.QfUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.Spliterator;
import java.util.UUID;

/**
 * @author 千锋健哥
 */
@Service
public class TenantServiceImpl implements TenantService {

    @Autowired
    private CheckCodeFeign checkCodeFeign;

    @Autowired
    private TenantFeign tenantFeign;

    @Override
    public R addTenant(TenantDto dto) {
        //1. 判断传参如果为空不允许注册
        if (dto == null) {
            R.fail("注册数据填写错误, 请从新填写!");
        }

        //2. 获取手机号, 判断手机号不为空, 为空不允许注册
        if (StringUtils.isEmpty(dto.getPhone())) {
            R.fail("手机号不能为空, 请从新填写!");
        }

        //3. 根据手机号到redis中获取验证码
        R<String> codeResult = checkCodeFeign.getCode(dto.getPhone());
        String code = codeResult.getMessage();

        //4. 对比页面传入的验证码和redis中的验证码, 一致允许注册
        if (dto.getCode().equals(code)) {
            //5. 调用service基础服务保存租户注册数据
            String encodePwd = QfUtil.md5(dto.getPwd());
            dto.setPwd(encodePwd);

            QfTenant tenant = new QfTenant();
            //将dto转成实体类
            dto.convertDtoToDo(tenant);

            //生成租户主键ID
            long id = new IdWorker().nextId();
            tenant.setId(String.valueOf(id));

            //生成AccessKey, 这个key和id一样
            tenant.setAccessKey(tenant.getId());

            //生成AccessSecurit, 可以生成一个随机字符串作为秘钥, xxxxxxxxx
            tenant.setAccessSecurit(UUID.randomUUID().toString().replace("-", ""));

            //审核状态,0待审核
            tenant.setAuditStatus(0);

            //初始化账户是否可用, 1可用
            tenant.setEnable(1);

            //保存注册
            R<QfTenant> tenantResult = tenantFeign.add(tenant);
            return tenantResult;
        } else {
            return R.fail("注册失败, 验证码错误!");
        }

    }

    @Override
    public R login(TenantDto dto) {
        //1. 判断如果用户名, 密码为空, 不允许登录
        if (dto == null) {
            return R.fail("用户名, 密码不能为空");
        }
        if (StringUtils.isEmpty(dto.getName())) {
            return R.fail("用户名不能为空!");
        }
        if (StringUtils.isEmpty(dto.getPwd())) {
            return R.fail("密码不能为空!");
        }

        //2. 根据用户名查租户对象
        TenantDto paramDto = new TenantDto();
        paramDto.setName(dto.getName());
        R<List<QfTenant>> tenantResult = tenantFeign.findTenantAll(paramDto);

        //3. 判断如果租户对象为空, 返回用户名错误
        if (tenantResult == null) {
            return R.fail("用户名错误!");
        }
        List<QfTenant> tenantList = tenantResult.getData();
        if (tenantList == null || tenantList.size() == 0) {
            return R.fail("用户名错误!");
        }
        QfTenant tenant = tenantList.get(0);

        //4. 从用户对象中获取密码, 进行密码校验
        String encodePwd = QfUtil.md5(dto.getPwd());
        if (encodePwd.equals(tenant.getPwd())) {
            //5. 登录成功根据租户id生成jwt返回
            String jwt = JwtUtil.createJWT(UUID.randomUUID().toString(), tenant.getId(), null);
            return R.ok(jwt);
        } else {
            //6. 如果密码校验失败, 那么返回密码错误
            return R.fail("密码错误");
        }


    }

}
